Modern computer systems are generally formed of numerous components that are coupled together to interoperate and perform various processing functions under control of a central processor, commonly referred to as a central processing unit (CPU). Most systems typically include a collection of semiconductor devices including processors, peripheral devices, dedicated processing units and so forth, in addition to additional semiconductor devices that act as a system memory to provide storage for information used by the processing units. In many systems, multiple memories are present, each of which can be associated with a given processor that thus acts as local memory for the corresponding processor. However, data located in a memory associated with a first processor may need to be accessed by another processor.
To maintain the coherency of data across the system, a cache coherency protocol such as a directory-based protocol may be implemented in a system. In a directory-based cache coherence protocol, agents that guard the memory, often referred to as home agents (HAs), collectively maintain a directory that tracks where and in what state each cacheline is cached in the system. A caching agent (CA) that seeks to acquire a cacheline sends a request to a HA, which looks up the directory and sends messages, commonly referred to as snoops, to only those CAs which the directory indicates may have cached copies of the line. If the directory indicates that no cached copies exist or that only shared copies exist and the request is for another shared copy, no snoops need be sent and the request can be satisfied from memory. Thus in certain cases, the directory can eliminate the need for snooping all CAs for each request, reducing the bandwidth requirement of snoops.
Once snoop responses (if any) have been received, the state of the new directory entry is computed and stored into memory. Memory bandwidth is consumed to save the new directory state into memory, and this usage directly detracts from memory bandwidth available to an application.
In certain situations and usage models (e.g., memory migration and mirroring, disabling of directory entries due to uncorrectable memory errors (assuming the directory is maintained in memory), post-silicon validation, and manufacturing tests), the directory state cannot be determined for a given entry and the system must fall back to snooping all CAs for each request to such entry. In these situations, the directory is assumed to be an unknown state which thus can cause increased bus traffic due to the needed snoop message transmission. In other cases, bandwidth may also be consumed in maintaining the coherency information even where data is used by a single agent.